﻿using System;
using System.ComponentModel.DataAnnotations;
using System.Net;
using System.Text;
using System.Web.Mvc;
using WebTV_Kickstarter;

namespace Kickstarter.Controllers
{
    public class GebruikerController : Controller
    {

        // GET: /Gebruiker/
        public ActionResult Index()
        {
            Gebruiker g = (Gebruiker)Session["gebruiker"];
            if (Session["gebruiker"] != null)
            {
                if (Gebruiker.IsAdmin())
                {
                    return View(Gebruiker.GetAllGebruikers());
                }
                else
                {
                    return RedirectToAction("../Gebruiker/Details/" + g.Id);
                }
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }

        // GET: /Gebruiker/Details/5
        public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            if (Session["gebruiker"] != null)
            { 
               Gebruiker g = (Gebruiker)Session["Gebruiker"];
               if (g.Id == id)
               {
                   Gebruiker gebruiker = Gebruiker.FindGebruiker(id);
                   if (gebruiker == null)
                   {
                       return HttpNotFound();
                   }
                   return View(gebruiker);
               }
               else if (Gebruiker.IsAdmin())
               {
                   Gebruiker gebruiker = Gebruiker.FindGebruiker(id);
                   if (gebruiker == null)
                   {
                       return HttpNotFound();
                   }
                   return View(gebruiker);
               }
               else
               {
                   return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
               }
            }
            else
            {
                return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
            }
        }

        // GET: /Gebruiker/Create
        public ActionResult Create()
        {
            if (Session["gebruiker"] != null)
            {
                return RedirectToAction("Index", "Home");
            }
            else
            {
                return View();
            }
        }

        // POST: /Gebruiker/Create
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        [ValidateInput(true)]
        public ActionResult Create([Bind(Include="Id,Name,Place,Adress,Email,Company,isAdmin,TotalDonated,Wachtwoord")] Gebruiker gebruiker)
        {
            //if (gebruiker.Name != null && gebruiker.Place != null && gebruiker.Adress != null && gebruiker.Email != null && gebruiker.Wachtwoord != null)
            //{
            if(ModelState.IsValid)
            {
                    Gebruiker.AddGebruiker(gebruiker);

                    return RedirectToAction("Index");
            }
            //}
            else
            {
                return View();
            }
        }

        // GET: /Gebruiker/Edit/5
        public ActionResult Edit(int? id)
        {
            ViewBag.isAdmin = false;
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            if (Session["gebruiker"] != null)
            {
                Gebruiker g = (Gebruiker)Session["Gebruiker"];
                ViewBag.isAdmin = Gebruiker.IsAdmin();
                if (g.Id == id)
                {
                    Gebruiker gebruiker = Gebruiker.FindGebruiker(id);
                    if (gebruiker == null)
                    {
                        return HttpNotFound();
                    }
                    return View(gebruiker);
                }
                else if (Gebruiker.IsAdmin())
                {
                    Gebruiker gebruiker = Gebruiker.FindGebruiker(id);
                    if (gebruiker == null)
                    {
                        return HttpNotFound();
                    }
                    return View(gebruiker);
                }
                else
                {
                    return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
                }
            }
            else
            {
                return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
            }
        }

        // POST: /Gebruiker/Edit/5
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include = "Id,Name,Place,Adress,Email,Company,isAdmin,TotalDonated,Wachtwoord")] Gebruiker gebruiker)
        {
            ViewBag.isAdmin = false;
            if (gebruiker.isAdmin == null)
            {
                gebruiker.isAdmin = false;
            }
            if (ModelState.IsValid)
            {
                Gebruiker.EditGebruikerForEdit(gebruiker);

                return RedirectToAction("Index");
            }
            return View(gebruiker);
        }

        public ActionResult Login()
        {            
            if (Session["gebruiker"] != null)
                return RedirectToAction("Index", "Home");
            else
                return View();
        }

        public ActionResult Uitloggen()
        {
            if (Session["gebruiker"] != null)
                Session.Clear();
            return View();
        }

        //Login
        [HttpPost, ActionName("Login")]
        [ValidateAntiForgeryToken]
        public ActionResult Login([Bind(Include = "Email,Wachtwoord")] Gebruiker login)
        {

            if (login.Wachtwoord != null)
            {
                Gebruiker.Login(login);

                if (Session["redirectBack"] != null)
                {
                    RedirectToRouteResult r = RedirectToAction(Session["redirectBack"].ToString());
                    Session.Remove("redirectBack");
                    return r;
                }
                else if (Session["gebruiker"] != null)
                    return RedirectToAction("Index", "Home");
                else
                    ViewBag.ErrorMessage = "Error";
                    return View();
            }
            else
            {
                ViewBag.ErrorMessage = "Error";
                return View();
            }
        }

        // GET: /Gebruiker/Delete/5
        public ActionResult Delete(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            if (Session["Gebruiker"] != null)
            {
                Gebruiker g = (Gebruiker)Session["Gebruiker"];
                if (Gebruiker.IsAdmin())
                {
                    Gebruiker gebruiker = Gebruiker.FindGebruiker(id);
                    if (gebruiker == null)
                    {
                        return HttpNotFound();
                    }
                    return View(gebruiker);
                }
                else
                {
                    return RedirectToAction("Index", "Home");
                }
            }
            return RedirectToAction("Index", "Home");
        }

        // POST: /Gebruiker/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {
            Gebruiker.RemoveGebruiker(id);
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                Gebruiker.Dispose();
            }
            base.Dispose(disposing);
        }

        // GET
        public ActionResult ResetPassword()
        {
            if (Session["gebruiker"] != null)
            {
                return RedirectToAction("Index", "Home");
            }
            else
            {
                return View();
            }
        }

        // POST
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult ResetPassword([Bind(Include = "Email")] string email)
        {
            if (ModelState.IsValid)
            {
                Gebruiker.EditGebruikerWachtwoord(email);

            }
            return RedirectToAction("Index", "Home");
        }

        [HttpGet]
        public String GetDonaties(int id)
        {
            Donation[] d = Donation.getDonationsFromUser(id);
            string html = "";
            foreach (Donation donatie in d)
            {
                html += "<dt>" + donatie.Project.Id + " - " + donatie.Project.Title + "</dt>" + "<dd> €" + donatie.Amount + "</dd>";
            }
            return html;
        }

        [HttpGet]
        public String GetMessages(int id)
        {
            Message [] m = Message.getMessageFromUser(id);
            string html = "";
            foreach (Message message in m)
            {
                html += "<dt>" + message.Project.Id +" - "+ message.Project.Title + "</dt>" + "<dd>" + message.Context + "</dd>";
            }
            return html;
        }
    }
}
